【论文笔记】Statically Discovering High-Order Taint Style Vulnerabilities in OS Kernels

2021-0925-SUTURE

Statically Discovering High-Order Taint Style Vulnerabilities in OS Kernels

作者:Hang Zhang, Weiteng Chen, Yu Hao, Guoren Li, Yizhuo Zhai, Xiaochen Zou, Zhiyun Qian

单位:UC Riverside

会议:CCS 2021

链接:https://www.cs.ucr.edu/~zhiyunq/pub/ccs21_static_high_order.pdf

Introduction

使用静态分析进行漏洞挖掘存在一个众所周知的问题:误报率高,尤其是针对像linux kernel这种代码量较大的系统,这也使得几乎没有误报的动态分析技术如fuzzing等更受欢迎。

大型系统中往往存在一些很复杂的漏洞,从用户输入(taint source)到最终触发敏感操作(taint sink)需要经历一系列的函数调用,作者称这些漏洞为high-order taint style vulnerabilities。

实现一个能够发现high-order vulnerabilities、good coverage, while minimizing false alarms的静态分析工具主要存在两个挑战:1. 分析需要对一个entry函数走过尽可能多的组合(在序列中的调用顺序)2. 足够准确的处理有检查的cross-entry taint flow,否在会带来很多的误报。

作者实现了SUTURE,一个高精度、可扩展的静态分析工具,以发现OS kernel中的high-order taint style vulnerabilities。SUTURE使用了一种summary-based high-order taint flow construction的方法对cross-entry taint flows进行模拟。能够得到高精度的inter-procedural flow-, context-, field-, index-, and opportunistically path-sensitive static taint analysis分析结果。

作者在多个主流Android kernel上使用SUTURE,生成了79个true positive warning groups,其中19个被厂商确认。

Overview

The Motivating Example

Untitled

Workflow

Untitled

Static Analysis Design

Positioning

基于Dr. Checker主要的数据结构实现,并作出了诸多改进,作者指出主要特点:1. 支持high-order taint flow construction,2. 数个提升分析精度和准确性的技术

Definitions

Def 0. entry function作为入口函数,在同一模块内没有调用者,由用户或其他模块进行调用(如ioctl)

Summary-Based High-Order Taint Flow Construction

Untitled

Taint Summary Generation

与之前的taint summary类似,区别在于SUTURE使用这些summaries连接多个top-level entry functions,而不是把caller连接到callee。

因为当指针涉及全局变量时,它可能在任何的entry function中被改变。

High-Order Taint Flow Construction

Global Memory Matching

SUTURE能够处理两种global memory:显示定义的和可以通过全局指针访问的内存。后者处理起来更困难啊。

T3可以连接T1,T3也可以连接T4

Taint Overwrite

Opportunistic Path Sensitivity

众所周知,由于无法感知冲突的路径约束,静态分析可能会分析不可达的路径,从而导致不准确(例如,不可能的污点传播)和效率低(例如,分析不必要的分支)。直接的解决方案时采用path-sensitive的分析方案,但是由于复杂的约束求解和路径爆炸,完全的path-sensitive方案的开销过高。因此作者希望能够尽可能path-sensitive,同时避免过高的开销,因此称为opportunistic path-sensitive analysis。

主要基于两点观察:

  1. 内核中很大一部分的路径约束很简单,收集并求解这些路径约束可以做大量的剪枝
  2. 可以以某种形式讲path-sensitive分析结合进flow-sensitive的工作流程中

约束收集比较简单,当分支属于𝑜𝑝 ∈ {==, >, <, ≥, ≤}时,收集约束。作者称可以在17条不可行路径中过滤掉16条路径。

Untitled

Multi-Source Multi-Sink Pairing

这是作者表示在研究过程中遇到的另一个问题,如果处理不好,会导致points-to、污点的爆炸,并导致大量的误报。常用的指针赋值处理方式如Dr. Checker和SVF中是all to all的,即取并集or双射,但是显然在程序的实际运行中下图中subs和data_subs是对应的。

为了解决这个问题,作者采用“折叠”的方式,使sink和source共享同样的源。

Untitled

Other Improvements in SUTURE

Memory SSA based Analysis

虽然LLVM IR变量是SSA形式的,但是内存对象却不是,就造成了实现flow-、context-sensitive分析时的困难。

为了解决这个问题,SUTURE实现了一种on-the-fly memory SSA 分析。

Untitled

Index Sensitivity

处理了常量索引的读取(v=a[2])

General Language Feature Support

改进了Dr. Checker的结构体嵌套、指针运算

Kernel Code Pattern Handling

加入了基于类型的方法来解决间接调用目标

Multi-Tag Taint Analysis

Vulnerability Discovery And Warning Grouping

Vulnerability Detectors

沿用了Dr.Checker的漏洞检测器

On-Demand Query of Taint Summaries

Warning Grouping

Implementation

  • built on top of Dr. Checker
  • 15k代码量
  • LLVM 9.0

Evaluation

Dataset

Untitled

Efficacy of SUTURE’s Static Analysis Improvements

Untitled

Vulnerability Discovery Accuracy

Untitled

Known High-Order Taint Vulnerabilities

Untitled

Efficiency

Untitled

Study of Discovered Vulnerabilities

整数溢出:

Untitled

OOB:

Untitled

Conclusion

作者使用了诸多针对于静态分析的优化,实现了十分高精度的静态分析,从而能够发现较复杂的一些漏洞。